package com.itheima.d5_generics;

import java.util.ArrayList;

/**
 * 1、泛型就是一个类型变量，可以指定具体操作的数据类型。比如ArrayList<E>，可以限定集合操作的数据类型
 * 2、泛型的作用：可以在编译阶段去检查数据的类型是否合法，可以避免不必要的类型强制转换及类型转换异常
 * 3、如果没有给泛型指定具体类型，泛型代表的含义就是Object
 */
public class Test1 {
    public static void main(String[] args) {
        // 目标：认识泛型

        //泛型若没有指定，默认就是Object类型
        ArrayList list = new ArrayList();
        list.add("Hello");
        list.add("Hello");
        list.add(123);
        list.add(true);
        //当数据传入到集合中，数据的类型会提升为Object
        String o = (String)list.get(0);

        Object o2 = list.get(1);

        //强制转换类型，可能会带来类型转换的异常
        String o1 = (String)list.get(2);
//        System.out.println("o1 = " + o1); //运行后报错：ClassCastException

        //通常会给泛型指定一个具体的类型
        ArrayList<String> names = new ArrayList<>();
//        names.add(100); //报错：在编译时就可以对类型进行检查，如果类型不对就会报错


        //泛型本质上是一个类型变量，可以使用类型来赋值而且只能使用引用类型来赋值
        ArrayList<String> list1 = new ArrayList<>(); //E ---> String
        ArrayList<Integer> list2 = new ArrayList<>(); //E ---> Integer
    }
}




